﻿#ifndef DAWORKFLOW_H
#define DAWORKFLOW_H
#include <QtCore/qglobal.h>
#include <memory>
#include <QObject>
#include "DAWorkFlowGlobal.h"
#include "DAAbstractNodeFactory.h"
DA_IMPL_FORWARD_DECL(DAWorkFlow)

/**
 * @brief 基本的工作流,这个也是总工厂，汇总了所有插件的工厂
 */
class DAWORKFLOW_API DAWorkFlow : public QObject
{
    Q_OBJECT
    DA_IMPL(DAWorkFlow)
public:
    DAWorkFlow(QObject *p = nullptr);
    ~DAWorkFlow();
    //工厂相关
    void registFactory(DAAbstractNodeFactory *factory);
    void registFactorys(const QList<DAAbstractNodeFactory *> factorys);

    //创建节点，会触发信号nodeCreated,FCWorkFlow保留节点的内存管理权
    DAAbstractNode::SharedPointer createNode(const DANodeMetaData &md);

    //删除节点
    void removeNode(DAAbstractNode::SharedPointer n);

    //开始工作流
    void start();

    //设置开始运行的节点
    void setStartNode(DAAbstractNode::SharedPointer n);
signals:

    /**
     * @brief 节点创建产生的信号
     * @param node
     */
    void nodeCreated(DAAbstractNode::SharedPointer node);
    /**
     * @brief 节点在工作流中开始被删除
     * @param node
     */
    void nodeStartRemove(DAAbstractNode::SharedPointer node);

    /**
     * @brief 工作流开始信号
     */
    void workflowStarted();

    /**
     * @brief 工作流结束信号
     */
    void workflowFinished();
};

#endif // FCWORKFLOW_H
